package pe.edu.sisclas.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;

import pe.edu.sisclas.model.domain.Docente;
import pe.edu.sisclas.model.domain.Soporte;
import pe.edu.sisclas.model.domain.Usuario;
import pe.edu.sisclas.model.domain.util.FacesMessagesHelper;
import pe.edu.sisclas.model.service.UsuarioService;
import pe.edu.sisclas.model.service.exception.ServiceException;

public class ValidarUsuarioController implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	private UsuarioService usuarioService;

	private static final String growlPath = "form:growl";

	private Usuario usuarioSelec;
	private Docente docenteSelec;
	private Soporte soporteSelec;
	private List<Usuario> listaUsuarios;
	private List<Docente> listaDocentesBusq;

	public ValidarUsuarioController() {

	}

	@PostConstruct
	public void init() {
		listarUsuarios();
	}

	public void Delete(Usuario usu) {
		try {
			usuarioService.Delete(usu);
		} catch (ServiceException e) {
			mensaje("Error", e.getMessage());
		}
	}

	public void listarUsuarios() {
		try {
			listaUsuarios = usuarioService.getUsuarios();
		} catch (ServiceException e) {
			e.printStackTrace();
		}
	}

	public void crearUsuario() {

		try {
			Usuario user = new Usuario();

			this.usuarioService.obtenerUsuarioPorDocente(docenteSelec);
			// Falta darle función a esto =P

			user.setContrasenia(docenteSelec.getCodigoDocente());
			user.setDocente(docenteSelec);
			user.setSoporte(soporteSelec);
			user.setAlta(Boolean.TRUE);
			usuarioService.crearUsuario(user);
			FacesMessagesHelper.sendGrowlMessage(FacesMessage.SEVERITY_INFO,
					"Usuario creado", user.getDocente().getNombreDocente(),
					growlPath);
			limpiarCampos();
			refrescarUsuarios();
			RequestContext.getCurrentInstance().execute("PF('dialog').hide()");
		} catch (ServiceException e) {
			FacesMessagesHelper.sendGrowlMessage(FacesMessage.SEVERITY_INFO,
					"Importante", "El nombre ya existe en el Sistema.", null,
					"dialog");
		}
	}

	public void limpiarCampos() {
		docenteSelec = new Docente();
		usuarioSelec = new Usuario();
		soporteSelec = new Soporte();
	}

	public void refrescarUsuarios() {
		listarUsuarios();
	}

	public List<Docente> completeDocente(String query) {
		try {
			listaDocentesBusq = usuarioService.validarUsuario(query);
			return listaDocentesBusq;
		} catch (ServiceException e) {
			e.printStackTrace();
			return new ArrayList<Docente>();
		}
	}

	/**
	 * Eventos
	 * */

	public void nuevoEvent(ActionEvent evt) {
		docenteSelec = new Docente();
	}

	public void procesarDialog() {
		crearUsuario();
	}

	public Usuario getUsuarioSelec() {
		return usuarioSelec;
	}

	public void setUsuarioSelec(Usuario usuarioSelec) {
		this.usuarioSelec = usuarioSelec;
	}

	public List<Usuario> getListaUsuarios() {
		return listaUsuarios;
	}

	public void setListaUsuarios(List<Usuario> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public List<Docente> getListaDocentesBusq() {
		return listaDocentesBusq;
	}

	public void setListaDocentesBusq(List<Docente> listaDocentesBusq) {
		this.listaDocentesBusq = listaDocentesBusq;
	}

	public Docente getDocenteSelec() {
		return docenteSelec;
	}

	public void setDocenteSelec(Docente docenteSelec) {
		this.docenteSelec = docenteSelec;
	}

	private void mensaje(String ttl, String msj) {
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(ttl, msj));
	}
}
